<?php
// $Id: groups_controller.php @2009 ccbox.net 1:22 2009-5-14 $

/**
 * Controller_Admin_Groups 控制器
 */
// group_id, parent_id, group_name, left_value, right_value, description, has_users
class Controller_Admin_Groups extends Controller_Abstract
{
    /* ******************************************************************** */
    function actionIndex()
    {
        $show_box['title'] = '用户组管理首页';
        // 分页查询
        $page = intval($this->_context->page);
        if ($page < 1) $page = 1;
        // 构造查询对象
        $select = Admin_Groups::find();
        $select -> limitPage($page, 15);

        // 将分页信息和查询到的数据传递到视图
        $show_box['pagination']  = $select->getPagination();
        $show_box['groups']       = $select->getAll();

        $this->_view['show_box'] = $show_box;
    }

    /* ******************************************************************** */
    function actionAdd()
    {
        $show_box['title'] = '添加用户组';
        // 构造表单对象
        $show_box['form'] = new Form_GroupForm(url('admin::groups/add'));
        $show_box['form']->_subject = $show_box['title'];
        if ($this->_context->isPOST() && $show_box['form']->validate($_POST))
        {
            try
            {
                $db_one = new Admin_Groups($show_box['form']->values());
                //测试
                //$test_arr = Admin_Roles::find('rolename = ?', 'UNCHECKED')->query();
                //print_r($test_arr->toArray());
                //print_r($db_one->toArray());
                //
               $db_one->roles[] = Admin_Roles::find('rolename = ?', 'UNCHECKED')->query();
               //print_r($db_one->toArray());
                $db_one->save();
                return $this->_redirectMessage(
                    '添加分组成功', 
                    '新的分组已经添加成功。',
                    url('admin::groups/index'));
            }
            catch (QValidator_ValidateFailedException $ex)
            {
                $show_box['form']->invalidate($ex);
            }
/*            catch (QDB_ActiveRecord_ValidateFailedException $ex)
            {
                $show_box['form']['rolename']->invalidate("角色名已经存在");
            }*/
        }
        // 将表单对象传递给视图
        $this->_view['show_box'] = $show_box;
        $this->_viewname = 'form';
    
    }

    /* ******************************************************************** */
    function actionView()
    {
        $show_box['title'] = '查看用户组';
        // 查询指定用户 ID
        $show_box['main_info'] = Admin_Groups::find('group_id = ?', $this->_context->group_id )->query();
        if ( !$show_box['main_info'] -> id() )
        { // 如果 ID 无效，则返回用户管理首页
            return $this->_redirect(url('admin::groups/index'));
        }
        $this->_view['show_box'] = $show_box;
    }

    /* ******************************************************************** */
    function actionEdit()
    {
        $show_box['title'] = '编辑用户组';
        // 查询指定 ID
        $db_one = Admin_Groups::find('group_id = ?', $this->_context->group_id )->query();
        if ( !$db_one->id() )
        { // 如果 ID 无效，则返回
            //return $this->_redirect(url('admin::groups/index'));
                return $this->_redirectMessage(
                    '分组ID无效', 
                    '分组ID无效，请检查你的表单。',
                    url('admin::groups/index'));
        }
        // 构造表单对象
        $show_box['form'] = $form = new Form_GroupForm(url('admin::groups/edit'));
        $show_box['form']->_subject = $show_box['title'];
        if ($this->_context->isPOST() && $show_box['form'] -> validate($_POST))
        {
            try{
                // changeProps() 方法可以批量修改  对象的属性，但不会修改只读属性的值
                $db_one->changeProps($show_box['form']->values());
                $db_one->save();
                return $this->_redirect(url('admin::groups/index'));
            }
            catch (QValidator_ValidateFailedException $ex)
            {
                $show_box['form']->invalidate($ex);
            }
        }elseif (!$this->_context->isPOST()){
            // 如果不是 POST 提交，则把对象值导入表单
            $show_box['form']->import($db_one);
        }
        $this->_view['show_box'] = $show_box;
        $this->_viewname = 'form';
    }

    /* ******************************************************************** */
    function actionDel()
    {
        $show_box['title'] = '删除用户组';
        //注意设定用户删除的锁定
        if($this->_context->group_id)
        {
        	$group_id = $this->_context->group_id;
        	Admin_Groups::meta()->destroyWhere('group_id = ?', $group_id);
        	if(mysql_affected_rows())
        	{
        		return $this->_redirectMessage(
                '用户组删除成功', 
                '指定用户组删除成功',
                url('admin::groups/index')
                );
        	}
        	else
        	{
        		return $this->_redirectMessage(
                '用户组删除失败', 
                '指定用户组删除失败',
                url('admin::groups/index')
                );
        	}
        }
        else
        {
        	return $this->_redirectMessage(
                '错误操作', 
                '操作错误，返回首页',
                url('admin::groups/index')
                );
        }
    }
    
 /* ******************************************************************** */
    function actionBind()
    {//删除权限-从中间表删除相关联系，用中间表模型
        $show_box['title'] = '用户组角色绑定';

        $group_id = $this->_context->group_id;
        //$roles = array('3'=>'1','4'=>'0','5'=>'1','2'=>'n','6'=>'n',);
        // 查询指定用户 ID
        $show_box['group_info'] = Admin_Groups::find('group_id = ?', $group_id )->getOne();
        if ( !$show_box['group_info'] -> id() )
        { // 如果用户 ID 无效，则返回用户管理首页
            return $this->_redirect(url('admin::groups/index'));
        }
		
		//找出所有角色信息
        $show_box['roles'] =  Admin_Roles::find()->asArray()->getAll();
		//找出该用户所具有的角色信息
        $group_roles =  Admin_GroupsHaveRoles::find('group_id = ?',$group_id )->asArray()->getAll();
        //print_r($group_roles);
        
        foreach ($group_roles as $value){
            $show_box['group_roles'][$value['role_id']] = $value['is_include'];
        }
		//取得数组中的所有键值
        $show_box['group_roles']['role_id'] = array_keys( $show_box['group_roles'] );

        if ($this->_context->isPOST() )
        {
        	//$test_arr = $this->_context->role_id->toArray();
        	//echo count($test_arr);
            foreach ($this->_context->role_id as $key=>$value){
				//"n"表示用户对应的角色（或权限）为NULL，是空的
                if ($value == 'n'){
                    Admin_GroupsHaveRoles::meta()->destroyWhere('group_id = ? AND role_id = ?', $group_id, $key);
                }else{
                    $find_one = Admin_GroupsHaveRoles::find('group_id = ? AND role_id = ?', $group_id, $key)->query();
                    if ($find_one['group_id']){
                        Admin_GroupsHaveRoles::meta()->updateDbWhere( array('is_include'=>$value), 'group_id = ? AND role_id = ?', $group_id, $key);
                        // 不能用以下这个方法，会添加重复记录，因为没有主键
                        //$find_one->is_include = $value;
                        //$find_one->save();
                    }else{
                    	//echo $group_id.'--'.$value.'--'.$key.'<br/>';
                        $add_one = new Admin_GroupsHaveRoles(array('group_id'=>$group_id,'role_id'=>$key,'is_include'=>$value));
                        $add_one->save();
                    }
                }
            }
            return $this->_redirectMessage(
                '用户组权限设定成功', 
                '指定用户组权限设定成功',
                url('admin::groups/bind',array('group_id'=>$group_id))
                );
        }
        
        $this->_view['show_box'] = $show_box;
    }


/***************************************************************************/
/**
 * 刷新成员数
*/
	function actionRefreshgroup()
	{
		$show_box['title'] = '刷新成员数';
		/***************************************全部刷新操作****************************************
		//从数据库所有用户组信息
		$groups = Admin_Groups::find()->getAll();
		//计算用户组的成员数,并存入数据库
		foreach($groups as $group):
			//取出组号相应的所有用户
			$users = Admin_Users::find('group_id = ?',$group->group_id)->getAll();
			//转换为相应数组
			$users_arr = $users->toArray();
			//成员数
			$users_num = count($users_arr);
			//echo $users_num.'<br/>';
			//将用户组成员数目存入数据库
			Admin_Groups::meta()->updateDbWhere( array('has_users'=>$users_num), 'group_id = ?', $group->group_id);	
			//$users_num = 0;
		endforeach;
		
		*/
		/******************************根据用户组编号刷新用户组成员数**************************/
		if($this->_context->group_id)
		{
			$group_id = $this->_context->group_id;
			//取出组号相应的所有用户
			$users = Admin_Users::find('group_id = ?',$group_id)->getAll();
			//转换为相应数组
			$users_arr = $users->toArray();
			//成员数
			$users_num = count($users_arr);
			//echo $users_num.'<br/>';
			//将用户组成员数目存入数据库
			Admin_Groups::meta()->updateDbWhere( array('has_users'=>$users_num), 'group_id = ?', $group_id);
		}
		else
		{
			return $this->_redirectMessage(
                '操作失败', 
                '操作失败，无法刷新用户组成员数',
                url('admin::groups/index')
                );
		}
		return $this->_redirectMessage(
                '刷新成员数成功', 
                '刷新用户组成员数操作成功',
                url('admin::groups/index')
                );
		
	}
}


